// config.go
package main

import (
	"encoding/json"
	"io/ioutil"
	"os"
)

// SiteItem 站点信息配置
type SiteItem struct {
	// 配置名称
	SiteName string
	// 基础域名
	Domain string
	// 字符编码，默认为 UTF-8
	// 有效值: gbk
	Code string

	// 列表正则表达式
	ListRegex string
	// 列表正则表达式代表链接的组号
	ListLink int
	// 链接的前缀内容，@index@ 表示与基础链接相同路径，@top@ 表示基于当前域名链接相同路径
	ListLinkPrefix string
	// 列表正则表达式代表标题的组号
	ListTitle int

	// 每页内容提取正则表达式
	PageRegex string
	// 每页内容提取正则表达式实际内容的组号
	PageGet int

	// 每行内容提取正则表达式
	LineRegex string
	// 每行内容提取正则表达式实际内容的组号
	LineGet int
}

// Config 配置信息
type Config struct {
	Items []SiteItem
}

// Load 从配置文件加载
func (e *Config) Load(filename string) {
	data, err := ioutil.ReadFile(filename)
	if err != nil {
		LogPrintln(0, "error: ioutil.ReadFile: ", err)
		panic(err)
	}

	rerr := json.Unmarshal(data, e)
	if rerr != nil {
		LogPrintln(0, "error: json.Unmarshal: ", rerr)
		panic(rerr)
	}

	LogPrintf(7, "配置文件数量: [%d]\n%v\n", len(e.Items), e.Items)
}

// Save 保存内容到配置文件
func (e *Config) Save(filename string) {
	data, err := json.Marshal(e)
	if err != nil {
		LogPrintln(0, "error: json.Marshal: ", err)
		panic(err)
	}

	werr := ioutil.WriteFile(filename, data, os.ModePerm)
	if werr != nil {
		LogPrintln(0, "error: ioutil.WriteFile: ", werr)
		panic(werr)
	}
}

// Get 获取指定项的配置
func (e *Config) Get(index int) SiteItem {
	return e.Items[index]
}

// Length 获取可用配置总数
func (e *Config) Length() int {
	return len(e.Items)
}
